package com.jr.controller;

// 导入各种所需的类
import com.google.gson.Gson; // Google的JSON序列化/反序列化库
import com.jr.pojo.ProjectInfo; // 项目信息实体类
import com.jr.service.IProjectInfoService; // 项目信息服务接口
import com.jr.service.impl.ProjectInfoServiceImpl; // 项目信息服务实现类
import com.jr.util.PageHelper; // 分页工具类

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;

/**
 * 项目信息控制器
 * 使用@WebServlet注解配置Servlet的访问路径为"/projectInfo/*"
 * 这意味着所有以"/projectInfo/"开头的URL请求都会被这个Servlet处理
 */
@WebServlet("/projectInfo/*")
public class ProjectInfoController extends HttpServlet {

    // 声明并初始化项目信息服务接口实例
    private IProjectInfoService ips = new ProjectInfoServiceImpl();

    /**
     * 重写service方法，作为请求的统一入口点
     * 该方法通过反射机制根据URL路径调用对应的具体方法
     */
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取请求的URI，例如：/asd/projectInfo/queryByPid
        String requestURI = request.getRequestURI();

        // 找到最后一个"/"的位置并加1，得到方法名的起始位置
        int index = requestURI.lastIndexOf("/") + 1;

        // 从URI中提取方法名，例如：queryByPid
        String mName = requestURI.substring(index);

        // 如果方法名为空，默认设置为"showdt"方法
        if(mName.length() == 0){
            mName = "showdt";
        }

        // 获取当前类的Class对象
        Class<ProjectInfoController> cla = ProjectInfoController.class;
        Method method = null;
        try {
            // 通过反射获取指定方法名的Method对象
            // 该方法需要接受HttpServletRequest和HttpServletResponse两个参数
            method = cla.getMethod(mName, HttpServletRequest.class, HttpServletResponse.class);

            // 使用反射调用获取到的方法，传入当前对象和请求、响应参数
            method.invoke(this, request, response);
        } catch (NoSuchMethodException e) {
            // 如果找不到对应的方法，打印异常堆栈
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // 如果方法不可访问，打印异常堆栈
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            // 如果方法调用抛出异常，打印异常堆栈
            e.printStackTrace();
        }
    }

    /**
     * 显示数据表格的方法 - 处理分页查询请求
     * 对应URL：/projectInfo/showdt
     */
    public void showdt(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // 设置响应内容类型为JSON，字符编码为UTF-8
        response.setContentType("application/json;charset=utf-8");

        // 从请求参数中获取状态值
        String status = request.getParameter("status");
        int proStatus = 0;

        // 处理状态参数，如果为空则设置为-1（表示查询所有状态）
        if(status == null){
            proStatus = -1;
        } else {
            proStatus = Integer.parseInt(status);
        }

        // 创建分页帮助对象
        PageHelper ph = new PageHelper();

        // 查询符合条件的数据总条数，并设置到分页对象中
        ph.setDateCount(ips.queryDataCount(proStatus));

        // 从请求参数中获取当前页码
        String indexpage = request.getParameter("indexpage");
        if(indexpage == null){
            // 如果页码为空，默认显示第一页
            ph.setPageIndex(1);
        } else {
            // 设置当前页码
            ph.setPageIndex(Integer.parseInt(indexpage));
        }

        // 根据状态和分页信息查询项目数据列表
        ArrayList<ProjectInfo> projectInfos = ips.queryByStatus(proStatus, ph);

        // 将查询到的数据列表设置到分页对象中
        ph.setListIndex(projectInfos);

        // 将分页对象转换为JSON格式并写入响应输出流
        response.getWriter().println(new Gson().toJson(ph));
    }

    /**
     * 根据项目ID查询项目详情的方法
     * 对应URL：/projectInfo/queryByPid
     * 前端调用示例：$.get("projectInfo/queryByPid", "pid=1001", ...)
     */
    public void queryByPid(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // 设置响应内容类型为JSON，字符编码为UTF-8
        response.setContentType("application/json;charset=utf-8");

        // 从请求参数中获取项目ID，并转换为整数类型
        int pid = Integer.parseInt(request.getParameter("pid"));

        // 调用服务层方法，根据项目ID查询项目详细信息
        ProjectInfo projectInfo = ips.queryByPid(pid);

        // 将查询到的项目信息对象转换为JSON格式并写入响应输出流
        response.getWriter().println(new Gson().toJson(projectInfo));
    }

    /**
     * 更新项目状态的方法
     * 对应URL：/projectInfo/updatePro
     * 前端调用示例：$.get("projectInfo/updatePro", {"pid":1001, "status":2}, ...)
     */
    public void updatePro(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
        // 从请求参数中获取状态值并转换为整数
        int status = Integer.parseInt(request.getParameter("status"));

        // 从请求参数中获取项目ID并转换为整数
        int pid = Integer.parseInt(request.getParameter("pid"));

        // 创建项目信息对象并设置ID和状态
        ProjectInfo pro = new ProjectInfo();
        pro.setPid(pid);
        pro.setStatus(status);

        // 调用服务层方法更新项目状态，返回更新结果（成功true/失败false）
        boolean b = ips.updateProject(pro);

        // 将更新结果转换为JSON格式并写入响应输出流
        response.getWriter().println(new Gson().toJson(b));
    }
}